﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Dziennik_ProfilNauczyciela.Wystawianie_ocen {
    public partial class WystawOceneCalejKlasie : Form {
        int idKlasy;
        int idPrzedmiotu;
        public WystawOceneCalejKlasie(int idKlasy, int idPrzedmiotu) {
            this.idKlasy = idKlasy;
            this.idPrzedmiotu = idPrzedmiotu;
            InitializeComponent();
            string przedmiot = (from p in SQLInterface.linqDataContext.przedmioties
                                where p.id == idPrzedmiotu
                                select p.nazwa).ToList().ElementAt(0);
            string klasa = (from k in SQLInterface.linqDataContext.klasies
                            where k.id == idKlasy
                            select ((k.semestr + 1) / 2).ToString() + k.nazwa).ToList().ElementAt(0);
            label_Klasa.Text = przedmiot + ", klasa " + klasa;
            WypelnijListeUczniow();
            textBox_ZaCo.BackColor = Color.Crimson;
            btn_Wystaw.Enabled = false;
        }

        public void WypelnijListeUczniow() {
            List<Uczen> listaUczniow = new List<Uczen>();
            var uczniowieOceny = (from u in SQLInterface.linqDataContext.uczniowies
                                  where u.idKlasy == idKlasy
                                  select new {
                                      nazwiskoImie = (string)(u.nazwisko + " " + u.imie),
                                      uid = (int)(u.userId)
                                  })
                                  .OrderBy(x => x.nazwiskoImie);
            int i = 1;
            foreach (var a in uczniowieOceny) {
                string numer = " " + i.ToString() + " ";
                
                string nazwiskoImie = (string)(a.nazwiskoImie);
                int uid = (int)a.uid;
                listaUczniow.Add(new Uczen(uid, numer, nazwiskoImie, null));
                i++;
            }
            dataGridView1.DataSource = listaUczniow;
        }

        private void textBox_ZaCo_TextChanged(object sender, EventArgs e) {
            if (textBox_ZaCo.Text == "") {
                textBox_ZaCo.BackColor = Color.Crimson;
                btn_Wystaw.Enabled = false;
            }
            else {
                textBox_ZaCo.BackColor = SystemColors.Control;
                btn_Wystaw.Enabled = true;
            }
        }

        private void btn_Wystaw_Click(object sender, EventArgs e) {
            System.Data.SqlClient.SqlTransaction tran = SQLInterface.conn.BeginTransaction(IsolationLevel.Serializable);
            SQLInterface.linqDataContext.Transaction = tran;
            try {
                foreach (Uczen u in (List<Uczen>)dataGridView1.DataSource) {
                    if (u.ocena != "") {
                        SQLInterface.linqDataContext.wystawOcene(
                            OcenaDouble(u.ocena),
                            Convert.ToInt32(numericUpDown_waga.Value),
                            textBox_ZaCo.Text,
                            u.userId,
                            idPrzedmiotu);
                    }
                }
                tran.Commit();
            }
            catch (Exception ex) {
                tran.Rollback();
                string blad = "Błąd transakcji - oceny nie zostały wystawione\n\n" + ex.Message;
                MessageBox.Show(blad, "Błąd transakcji");
                return;
            }
            Close();
        }

        double? OcenaDouble(string ocena) {
            if (ocena == null || ocena.Length == 0) return null;
            int ocena_i = Convert.ToInt32(ocena[0].ToString());
            if (ocena_i < 1 || ocena_i > 6) return null;
            if (ocena.Length == 1) return (double)ocena_i;
            else {
                if (ocena == "1-" || ocena == "6+" || !(ocena[1] == '+' || ocena[1] == '-')) return null;
                if (ocena[1] == '+') return (((double)ocena_i) + 0.3);
                else if (ocena[1] == '-') return (((double)ocena_i) - 0.3);
                else return null;
            }
        }
    }
}
